Ссылки по теме

*   [Install bundled 32-bit system in Arch64](/index.php/Install_bundled_32-bit_system_in_Arch64 "Install bundled 32-bit system in Arch64")
*   [PRoot](/index.php/PRoot "PRoot")
*   [systemd-nspawn](/index.php/Systemd-nspawn "Systemd-nspawn")

[Chroot](https://en.wikipedia.org/wiki/ru:chroot "wikipedia:ru:chroot") — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется *chroot jail*.

## Contents

*   [1 Причины](#.D0.9F.D1.80.D0.B8.D1.87.D0.B8.D0.BD.D1.8B)
*   [2 Требования](#.D0.A2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F)
*   [3 Монтирование разделов](#.D0.9C.D0.BE.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D1.80.D0.B0.D0.B7.D0.B4.D0.B5.D0.BB.D0.BE.D0.B2)
*   [4 Изменение корневого раздела](#.D0.98.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BA.D0.BE.D1.80.D0.BD.D0.B5.D0.B2.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D0.B7.D0.B4.D0.B5.D0.BB.D0.B0)
    *   [4.1 Используя arch-chroot](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_arch-chroot)
    *   [4.2 Используя chroot](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_chroot)
    *   [4.3 Используя systemd-nspawn](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_systemd-nspawn)
*   [5 Запуск графических приложений в среде chroot](#.D0.97.D0.B0.D0.BF.D1.83.D1.81.D0.BA_.D0.B3.D1.80.D0.B0.D1.84.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D1.85_.D0.BF.D1.80.D0.B8.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D0.B9_.D0.B2_.D1.81.D1.80.D0.B5.D0.B4.D0.B5_chroot)
*   [6 Выход из среды chroot](#.D0.92.D1.8B.D1.85.D0.BE.D0.B4_.D0.B8.D0.B7_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_chroot)
*   [7 Без прав суперпользователя](#.D0.91.D0.B5.D0.B7_.D0.BF.D1.80.D0.B0.D0.B2_.D1.81.D1.83.D0.BF.D0.B5.D1.80.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F)
    *   [7.1 PRoot](#PRoot)
    *   [7.2 Fakechroot](#Fakechroot)
*   [8 Смотрите также](#.D0.A1.D0.BC.D0.BE.D1.82.D1.80.D0.B8.D1.82.D0.B5_.D1.82.D0.B0.D0.BA.D0.B6.D0.B5)

## Причины

Изменение корневого каталога обычно производится для выполнения действий по обслуживанию систем, загрузка и/или вход в которых стали невозможны. В таком режиме, например, могут быть выполнены:

*   Переустановка [загрузчика](/index.php/Boot_loaders "Boot loaders").
*   Пересборка образа [initramfs](/index.php/Mkinitcpio_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Mkinitcpio (Русский)").
*   Обновление или [откат пакетов](/index.php/%D0%9E%D1%82%D0%BA%D0%B0%D1%82_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2 "Откат пакетов").
*   [Сброс пароля root](/index.php/%D0%A1%D0%B1%D1%80%D0%BE%D1%81_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8F_root "Сброс пароля root").

Смотрите также [Wikipedia:Chroot#Limitations](https://en.wikipedia.org/wiki/Chroot#Limitations "wikipedia:Chroot").

## Требования

*   Наличие привелегий суперпользователя.

*   Возможность загрузки с другой среды Linux, например, LiveCD, загрузочного USB-носителя или другого установленного дистрибутива.

*   Совпадение архитектур двух сред: с которой производится загрузка и в которую происходит изменение корня. Архитектуру текущей среды можно узнать командой `# uname -m` (например, i686 или x86_64).

*   Если среде chroot необходимы какие-нибудь модули ядра, они должны быть загружены.

*   Если нужен раздел подкачки, он должен быть включен: `swapon /dev/sdxY`.

*   Интернет-соединение установлено, если нужно.

## Монтирование разделов

Корневой раздел среды Linux, в которую вы хотите войти с chroot, должен быть первым делом смонтирован. Чтобы найти имя раздела, выполните:

```
# lsblk

```

Затем создайте каталог для монтирования корневого раздела и смонтируйте его:

```
# mkdir /mnt/arch
# mount /dev/sdx1 /mnt/arch

```

Если отдельные системные каталоги были вынесены на отдельные разделы, их также нужно смонтировать в файловую систему корневого раздела:

```
# mount /dev/sdx2 /mnt/arch/boot/
# mount /dev/sdx3 /mnt/arch/home/

```

**Примечание:** Если вы пытаетесь смонтировать [зашифрованную](/index.php/Disk_encryption "Disk encryption") файловую систему, не забудьте первым делом открыть ее контейнер (например, командой `# cryptsetup open /dev/sdX# *имя*` для шифрования на основе [dm-crypt/LUKS](/index.php/Disk_encryption#Block_device_encryption "Disk encryption")), затем смонтируйте устройство используя указанное *имя* (например, `# mount /dev/mapper/*имя* /mnt/arch/...`). Подробнее смотрите на странице: [Dm-crypt/Device encryption#Unlocking/Mapping LUKS partitions with the device mapper](/index.php/Dm-crypt/Device_encryption#Unlocking.2FMapping_LUKS_partitions_with_the_device_mapper "Dm-crypt/Device encryption").

## Изменение корневого раздела

### Используя arch-chroot

Bash-скрипт *arch-chroot* является частью пакета [arch-install-scripts](https://www.archlinux.org/packages/?name=arch-install-scripts) из [официальных репозиториев](/index.php/Official_repositories_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Official repositories (Русский)"). Перед тем, как запускать `/usr/bin/chroot`, этот скрипт монтирует интерфейсные файловые системы вроде `/proc` и делает `/etc/resolv.conf` доступным из под окружения chroot.

Запустите *arch-chroot* с указанием нового корневого каталога:

```
# arch-chroot /mnt/arch

```

Чтобы запустить командную оболочку bash вместо sh:

```
# arch-chroot /mnt/arch /bin/bash

```

Чтобы запустить `mkinitcpio -p linux` в окружении chroot минуя создание сеанса в командной оболочке:

```
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux

```

### Используя chroot

Смонтируйте временные интерфейсные файловые системы:

```
# cd /mnt/arch
# mount -t proc proc proc/
# mount --rbind /sys sys/
# mount --rbind /dev dev/

```

И, опционально:

```
# mount --rbind /run run/

```

Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:

```
# cp /etc/resolv.conf etc/resolv.conf

```

Чтобы запустить bash в окружении chroot:

```
# chroot /mnt/arch /bin/bash

```

**Примечание:** Если вы получили ошибки:

*   `chroot: cannot run command '/usr/bin/bash': Exec format error`, это значит, что архитектуры основной среды и среды нового корневого каталога не совпадают.
*   `chroot: '/usr/bin/bash': permission denied`, перемонтируйте раздел с разрешением exec: `mount -o remount,exec /mnt/arch`.

После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:

```
# source /etc/profile
# source ~/.bashrc

```

**Совет:** Вы также можете установить другое приглашение командной оболочки для того, чтобы отличать среду chroot от основной: `# export PS1="(chroot) $PS1"` 

### Используя systemd-nspawn

systemd-nspawn может использоваться для запуска команды или операционной системы в легковесном контейнере. Во многих случаях он похож на chroot, но является более мощным инструментом, так как он полностью эмулирует отдельную иерархию файловой системы и дерево процессов, различные системы межпроцессного взаимодействия, имя хоста и домена.

Перейдите в точку монтирования нового корневого раздела и запустите systemd-nspawn:

```
# cd /mnt/arch
# systemd-nspawn

```

Нет необходимости самостоятельно монтировать интерфейсные файловые системы вроде `/proc`, так как systemd-nspawn запускает новый процесс init в созданной виртуальной среде, который берет на себя эту задачу. Это похоже на загрузку второй операционной системы внутри основной, но без создания виртуальной машины.

Чтобы вернуться в основную систему, просто разлогиньтесь или запустите команду *poweroff*. После этого вы можете размонтировать разделы, как показано в [#Выход из среды chroot](#.D0.92.D1.8B.D1.85.D0.BE.D0.B4_.D0.B8.D0.B7_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_chroot).

## Запуск графических приложений в среде chroot

Если у вас есть запущенный [X-сервер](/index.php/Xorg "Xorg"), вы сможете запускать даже графические приложения в среде chroot.

Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду [xhost](/index.php/Xhost "Xhost"), которая даст права каждому подключаться к X-серверу пользователя:

```
$ xhost +local:

```

Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните

```
$ echo $DISPLAY

```

от имени этого пользователя для того, чтобы узнать значение переменной, и выполните

```
# export DISPLAY=:0

```

в среде chroot, установив переменной нужное значение (в данном примере это `:0`).

## Выход из среды chroot

После завершения работы, выйдите из сеанса chroot:

```
# exit

```

Теперь размонтируйте временные файловые системы и корневой раздел:

```
# cd /
# umount --recursive /mnt/arch/

```

**Примечание:** Если возникает ошибка наподобие: `umount: /path: device is busy`, обычно это значит, что либо какая-то программа в среде chroot все еще запущена, либо что-то пошло не так при размонтировании внутренних по отношению к корневому разделу. Выйдите из программы и используйте команду `mount` чтобы найти и размонтировать подразделы. Может быть несколько непросто размонтировать некоторые вещи, и вам может посчастливиться форсировать размонтирование опцией `umount --force`. В качестве последнего средства используйте опцию `umount --lazy`, которая просто освобождает устройства. В любом случае, чтобы обезопасить себя, перезагрузитесь как можно быстрее.

## Без прав суперпользователя

Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.

### PRoot

[PRoot](/index.php/PRoot "PRoot") может использоваться для изменения корневого раздела и использовать `mount --bind` без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию `--root-id`, которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в *fakeroot*.

### Fakechroot

[fakechroot](https://www.archlinux.org/packages/?name=fakechroot) является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с [fakeroot](https://www.archlinux.org/packages/?name=fakeroot) для создания видимости того, что chroot запускается суперпользователем.

```
# fakechroot fakeroot chroot ~/my-chroot bash

```

## Смотрите также

*   [Basic Chroot](https://help.ubuntu.com/community/BasicChroot)